package cn.lxh.system.interceptor;

import cn.lxh.system.jwt.JwtUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * LoginInterceptor登录拦截器
 */
@Component // 该类交给spring管理
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取Excel导出请求的token
        String exportExcelToken = request.getParameter("exportExcelToken");

        if (exportExcelToken != null) { // exportExcelToken不为null就解析
            // 解析exportExcelToken
            try {
                JwtUtil.parseJwtToken(exportExcelToken); // exportExcelToken解析成功, 不会抛异常
                return true; // 放行 (暂时有小bug, 没有做token刷新时间)
            } catch (Exception e) { // exportExcelToken解析失败, 会抛异常, 在这里捕获
                // 设置响应内容类型 (会自动将JSON格式的字符串转为JSON对象, 如果有中文请使用utf-8)
                response.setContentType("application/json;charset=utf-8");
                // 设置响应内容
                response.getWriter().print("{\"success\": false, \"message\" : \"toLogin\"}"); // JSON格式的数据 {"success": false, "message" : "toLogin"}
                return false; // 拦截
            }
        }

        // 获取Excel导入请求的请求头信息
        if ("do not stop me".equals(request.getHeader("importExcel"))) {
            return true; // 放行
        }

        // 前台的请求
        if ("front".equals(request.getHeader("requestType"))) {
            return true; // 放行
        }
        // 获取前端的请求头信息
        String token = request.getHeader("token");
        // 判断token是否为null
        if (token != null) { // token不为null就解析, 或者exportExcelToken不为null就解析
            // 解析token
            try {
                JwtUtil.parseJwtToken(token); // token解析成功, 不会抛异常

                return true; // 放行 (暂时有小bug, 没有做token刷新时间)
            } catch (Exception e) { // token解析失败, 会抛异常, 在这里捕获
                // 设置响应内容类型 (会自动将JSON格式的字符串转为JSON对象, 如果有中文请使用utf-8)
                response.setContentType("application/json;charset=utf-8");
                // 设置响应内容
                response.getWriter().print("{\"success\": false, \"message\" : \"toLogin\"}"); // JSON格式的数据 {"success": false, "message" : "toLogin"}
                return false; // 拦截
            }
        } else { // token为null
            // 设置响应内容类型 (会自动将JSON格式的字符串转为JSON对象, 如果有中文请使用utf-8)
            response.setContentType("application/json;charset=utf-8");
            // 设置响应内容
            response.getWriter().print("{\"success\": false, \"message\" : \"toLogin\"}"); // JSON格式的数据 {"success": false, "message" : "toLogin"}
            return false; // 拦截
        }

    }
}
